package estrategia;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public final class ParametrosPotenciales {
	private static final String NOMBRE_ARCHIVO_CAMPOS = "Parametros/CamposPotenciales.properties";
	
	public static double GANANCIA;
	public static double GANANCIA_MAGNITUD_DISTANCIA;
	public static double DISTANCIA_FUERTE;
	public static double DISTANCIA_ENEMIGO;
	public static double DISTANCIA_ALIADO;
	public static double DISTANCIA_PUNTO;
	public static double tamanioRobot;
	
	// Parametros del campo repulsor circular
	public static double radioCampoRepulsorCircular;
	public static double minAlcanceCampoRepulsorCircular;
	public static double KCampoRepulsorCircular;
	
	// Parametros del campo tangencial
	public static double radioCampoTangencial;
	public static double minAlcanceTangencial;
	public static double KCampoTangencial;
	
	// Parametros del campo de atraccion circular
	public static double KCampoAtraccionCircular;
	public static double radioCampoAtractor;
	
	// Parametros del campo de repulsion perpendicular a un semiplano
	public static double radioCampoSemiplano;
	public static double KCampoSemiplano;
	
	// Parametros del campo conico
	public static double maxAlcance;
	public static double minAlcance;
	public static double maxPotencia;
	public static double minPotencia;
	public static double angulo;
	
	
	static {
		try {
			loadProperties();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static void loadProperties() throws IOException {	
		Properties properties = new Properties();	    
    	InputStream is = new FileInputStream(NOMBRE_ARCHIVO_CAMPOS);
        properties.load(is);
    
	    if (properties.containsKey("GANANCIA")) {
	    	GANANCIA = Double.parseDouble(properties.getProperty("GANANCIA"));
	    } else {
	    	avisarError("GANANCIA");
	    }
	    
	    if (properties.containsKey("GANANCIA_MAGNITUD_DISTANCIA")) {
	    	GANANCIA_MAGNITUD_DISTANCIA = Double.parseDouble(properties.getProperty("GANANCIA_MAGNITUD_DISTANCIA"));
	    } else {
	    	avisarError("GANANCIA_MAGNITUD_DISTANCIA");
	    }
	    
	    if (properties.containsKey("DISTANCIA_FUERTE")) {
	    	DISTANCIA_FUERTE = Double.parseDouble(properties.getProperty("DISTANCIA_FUERTE"));
	    } else {
	    	avisarError("DISTANCIA_FUERTE");
	    }
	    
	    if (properties.containsKey("DISTANCIA_ENEMIGO")) {
	    	DISTANCIA_ENEMIGO = Double.parseDouble(properties.getProperty("DISTANCIA_ENEMIGO"));
	    } else {
	    	avisarError("DISTANCIA_ENEMIGO");
	    }
	    
	    if (properties.containsKey("DISTANCIA_ALIADO")) {
	    	DISTANCIA_ALIADO = Double.parseDouble(properties.getProperty("DISTANCIA_ALIADO"));
	    } else {
	    	avisarError("DISTANCIA_ALIADO");
	    }
	    
	    if (properties.containsKey("DISTANCIA_PUNTO")) {
	    	DISTANCIA_PUNTO = Double.parseDouble(properties.getProperty("DISTANCIA_PUNTO"));
	    } else {
	    	avisarError("DISTANCIA_PUNTO");
	    }    	
	    
	    
	    if (properties.containsKey("tamanioRobot")) {
	    	tamanioRobot = Double.parseDouble(properties.getProperty("tamanioRobot"));
	    } else {
	    	avisarError("tamanioRobot");
	    }    	
	    
	    
	    // Parametros de campo circular repulsor
	  
	    if (properties.containsKey("radioCampoRepulsorCircular")) {
	    	radioCampoRepulsorCircular = Double.parseDouble(properties.getProperty("radioCampoRepulsorCircular"));
	    } else {
	    	avisarError("radioCampoRepulsorCircular");
	    }    	
	    
	    if (properties.containsKey("minAlcanceCampoRepulsorCircular")) {
	    	minAlcanceCampoRepulsorCircular = Double.parseDouble(properties.getProperty("minAlcanceCampoRepulsorCircular"));
	    } else {
	    	avisarError("minAlcanceCampoRepulsorCircular");
	    }    	
	    
	    if (properties.containsKey("KCampoRepulsorCircular")) {
	    	KCampoRepulsorCircular = Double.parseDouble(properties.getProperty("KCampoRepulsorCircular"));
	    } else {
	    	avisarError("KCampoRepulsorCircular");
	    }    	
	    
	    
	    // Parametros de campo tangencial
	    
	    if (properties.containsKey("radioCampoTangencial")) {
	    	radioCampoTangencial = Double.parseDouble(properties.getProperty("radioCampoTangencial"));
	    } else {
	    	avisarError("radioCampoTangencial");
	    }    	
	    
	    if (properties.containsKey("minAlcanceTangencial")) {
	    	minAlcanceTangencial = Double.parseDouble(properties.getProperty("minAlcanceTangencial"));
	    } else {
	    	avisarError("minAlcanceTangencial");
	    }    	
	    
	    if (properties.containsKey("KCampoTangencial")) {
	    	KCampoTangencial = Double.parseDouble(properties.getProperty("KCampoTangencial"));
	    } else {
	    	avisarError("KCampoTangencial");
	    }    
	    
	    // Parametros de campo atractor
	    
	    if (properties.containsKey("KCampoAtraccionCircular")) {
	    	KCampoAtraccionCircular = Double.parseDouble(properties.getProperty("KCampoAtraccionCircular"));
	    } else {
	    	avisarError("KCampoAtraccionCircular");
	    }
	    
	    if (properties.containsKey("radioCampoAtractor")) {
	    	radioCampoAtractor = Double.parseDouble(properties.getProperty("radioCampoAtractor"));
	    } else {
	    	avisarError("radioCampoAtractor");
	    }    
	    
	    // Parametros de campo semiplano
	    
	    if (properties.containsKey("radioCampoSemiplano")) {
	    	radioCampoSemiplano = Double.parseDouble(properties.getProperty("radioCampoSemiplano"));
	    } else {
	    	avisarError("radioCampoSemiplano");
	    }    	
	    
	    if (properties.containsKey("KCampoSemiplano")) {
	    	KCampoSemiplano = Double.parseDouble(properties.getProperty("KCampoSemiplano"));
	    } else {
	    	avisarError("KCampoSemiplano");
	    }    
	    
	    
	    
	}
	
	private static void avisarError(String claveInexistente) throws IOException {
		throw new IOException("Falta propiedad " + claveInexistente + "en el archivo de propiedades " + NOMBRE_ARCHIVO_CAMPOS);
	}
}
